<?php

declare(strict_types=1);

namespace DreamCat\StateMachine\Popo\Define;

/**
 * 状态机节点详情
 * @author vijay
 */
class MachineNodeDetail
{
    /** @var string 节点名称 */
    private string $name;
    /** @var string 节点标识 */
    private string $key;
    /** @var bool 是否主流程结点 */
    private bool $mainStream;
    /** @var TransferDetail[] 支持的状态转移列表，key是动作标识 */
    private array $transferList = [];

    /**
     * @return string 节点名称
     */
    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @param string $name 节点名称
     */
    public function setName(string $name): void
    {
        $this->name = $name;
    }

    /**
     * @return string 节点标识
     */
    public function getKey(): string
    {
        return $this->key;
    }

    /**
     * @param string $key 节点标识
     */
    public function setKey(string $key): void
    {
        $this->key = $key;
    }

    /**
     * @return bool 是否主流程结点
     */
    public function isMainStream(): bool
    {
        return $this->mainStream;
    }

    /**
     * @param bool $mainStream 是否主流程结点
     */
    public function setMainStream(bool $mainStream): void
    {
        $this->mainStream = $mainStream;
    }

    /**
     * @return TransferDetail[] 支持的状态转移列表
     */
    public function getTransferList(): array
    {
        return $this->transferList;
    }

    /**
     * 添加一个状态转移，存在则覆盖
     * @param TransferDetail $transfer 要添加的状态转移
     * @return TransferDetail|null 如果原本存在则返回旧的，否则返回null
     */
    public function addTransferList(TransferDetail $transfer): ?TransferDetail
    {
        $ret = $this->transferList[$transfer->getActionId()] ?? null;
        $this->transferList[$transfer->getActionId()] = $transfer;
        return $ret;
    }

    /**
     * 删除一个状态转移
     * @param string $actionId 动作标识
     * @return TransferDetail|null 如果原本存在则返回旧的，否则返回null
     */
    public function deleteTransfer(string $actionId): ?TransferDetail
    {
        $ret = $this->transferList[$actionId] ?? null;
        unset($this->transferList[$actionId]);
        return $ret;
    }

    /**
     * 清除状态转移
     * @return TransferDetail[] 原有的状态转移
     */
    public function clearTransferList(): array
    {
        $list = $this->transferList;
        $this->transferList = [];
        return $list;
    }
}

# end of file
